/***************************************************************************
 创建者: 华磊
 开始时间: 2020.8.14
 copyright: (C) 华友高科
 修改说明: (每次有修改就添加一条，带有 修改人，修改时间，修改描述)
 example (1) hualei 2020.5.8 类的具体实现代码编写

 ***************************************************************************
 *  @file x.h
 *  功能:
 *
 *                                                                         *
 ***************************************************************************/
#ifndef VREPOBJECT_H
#define VREPOBJECT_H


#include <QObject>
#include <QVector>
#include <QTcpSocket>


#define D_CONST_AXIS_MAX 16
//1=测试用时
#define D_CHECK_SYNC_TIME 0
//1=同步控制// 其实是写数据后等待模拟器回应OK，再继续写
#define D_USE_SYNCHRONIZED_MODE 1


//使用数据文件,（未实现）
//#define D_HAS_IK_MODE 0

//机器人类型
enum E_ROBOT_CHOOSE{
    MTB_Robot,
    IRB4600,
    UR5,
    LBR_iiwa_7_R800,
    TCR7,
    UARM,
    E_ROBOT_5AxisWristAcRobot,
};


enum E_ECAT_REAL_VREP_MODE
{
    E_ECAT_REAL=0x0, //实体机
 //   eSimulationR=0x01, //没有这种用法
    E_ECAT_REAL_VREP=0x02,//实体机+仿真
    E_ECAT_VREP=0x03,//仿真
};

/**
 * @brief The S_CLIENT_DATA struct
 */
struct S_CLIENT_DATA{
    int pkgLen;//包长度
    int cmdType;//命令
    int vecSize;//vecData. size()
    QVector<float> vecData;//
};

/**
 * @brief The VrepObject class　连接处理模拟器和客户端的数据 ( 具体用法请参考 vreptest.cpp )
 */
class VrepObject : public QObject
{
    Q_OBJECT
public:
    explicit VrepObject(QObject *parent = 0);

    volatile int axisNum; //轴数
    float getPos[D_CONST_AXIS_MAX];
    float setPos[D_CONST_AXIS_MAX];//写完setPos数据后要写 setChanged=true
    int obHandles[ D_CONST_AXIS_MAX ];//句柄
    volatile bool isRunDemo;
    volatile bool setChanged;//有新数据
    volatile bool getChanged;//有新数据
    int robotChoose;//E_ROBOT_CHOOSE
    QString robotNmae;//E_ROBOT_CHOOSE

signals:
    //发给ＵＩ
    void signal_msg(QString msg ,int code );

public slots:
    /**
     * @brief slot_set_pos 移动指定轴
     * @param axis　指定轴
     * @param val　弧度
     */
    void slot_set_pos( int axis, float val );
    void slot_set_pos( QVector<float> val );
    void slot_get_pos( QVector<float> &val );
    /**
     * @brief displayMsg
     * @param msg　消息
     * @param code　消息代码或其他
     */
    void displayMsg( QString msg ,int code );
    /**
     * @brief test_demo 试运行
     */
    void test_demo();
    /**
     * @brief initVrepRobot  选择模型
     * @param clientID       vrep ID
     * @param robot_choose   机器人类型
     */
    void initVrepRobot( int clientID, int robot_choose );
    /**
     * @brief initVrepRobot  选择模型
     * @param clientID       vrep ID
     * @param robotName   机器人模型名字
     */
    void initVrepRobot( int clientID, QString robotName );

private:
    float demoPos[ D_CONST_AXIS_MAX ];

};

#endif // VREPOBJECT_H
